﻿using System;

namespace 约束
{
	class Program
	{
		static void Main(string[] args)
		{
			//无参 new();
			Test3<int> test3 = new Test3<int>();
			//接口约束
			Test5<Test51> test5 = new Test5<Test51>();
			test5.value = new Test51();
			Test5<Iove> love = new Test5<Iove>();
			//另一个约束
			Test6<Test51, Ifly> test6 = new Test6<Test51, Ifly>();
		}
	}

	//普通泛型类
	class Test
	{

	}

	#region 什么是泛型约束
	/* 让泛型的类型有一定的限制
	 * 关键词 where
	 * 泛型约束一共有6种
	 * 1.值类型								where 泛型字母：struct
	 * 2.引用类型						    where 泛型字母：class
	 * 3.存在无参公共构造函数				    where 泛型字母：new()
	 * 4.某个类本身或者其派生类				where 泛型字母：类目
	 * 5.某个接口的派生类型				    where 泛型字母：接口名
	 * 6.另一个泛型类型本啥或者派生类型		where 泛型字母：另一个泛型字母
	 * 
	 * where 泛型子母:(约束的类型)
	 */
	#endregion

	#region 值类型约束
	class Test1<T> where T : struct
	{
		public T value;
		public void Hello()
		{
			Console.WriteLine(value);
		}
	}
	#endregion

	#region 引用类型约束
	class Test2<T> where T : class
	{

	}
	#endregion

	#region 无参公共构造函数约束
	//可以为值类型，无法为私有构造函数，无法用抽象类
	class Test3<T> where T : new()
	{

	}
	#endregion

	#region 类型约束	
	//可以为Test的子类
	class Test4<T> where T : Test
	{

	}
	#endregion

	#region 接口约束
	interface Ifly { }
	interface Iove : Ifly { }
	class Test51 : Ifly { }

	class Test5<T> where T : Ifly
	{
		public T value;
	}
	#endregion

	#region 另一个约束
	class Test6<T, U> where T : U
	{
		public T value;
	}
	#endregion

	#region 约束的组合使用
	class Test7<T> where T : class, new()
	{

	}
	#endregion

	#region 多个泛型多个约束
	class Test8<T1, T2> where T1 : class, new() where T2 : struct
	{

	}
	#endregion
}
